package com.itheima.interceptor;

import com.alibaba.fastjson.JSON;
import com.itheima.pojo.Result;
import com.itheima.utils.JwtUtils;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component// 交给spring管理
public class LoginCheckInterceptor implements HandlerInterceptor {
    // 重写方法快捷键 ctrl+o
    /*
       目标资源执行之前执行
          返回值  true  放行
                 false 不放行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        System.out.println("preHandle... 在执行资源之前执行...");
        //1: 获取请求头的 token数据
        String token = request.getHeader("token");
        //2: 判断 token是否真实的存在  如果不存在 就 返回NOT_LOGIN (return false)
//        if(token==null || token.equals("")){
////            StringUtils.hasLength(token) 不是null并且不是空
//        }
        if(!StringUtils.hasLength(token)){// 加上非之后  token==null || token.equals("")
               // 返回NOT_LOGIN (return false)
              // 需要 响应实体Result对象
            Result result = Result.error("NOT_LOGIN");
            //转换成json
            String jsonString = JSON.toJSONString(result);
            //怎么给前端
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(jsonString);
            //结束
            return false;//没有放行
        }

        //3: 令牌有了，解析token令牌合法性  不合法 返回 NOT_LOGIN  (return false)
        try{
            JwtUtils.parseJWT(token);//暂时不需要 但是你要知道
                    // 你登录用户的id 用户名 在 token解析 载荷中
        }catch (Exception e){
            // 返回NOT_LOGIN (return false)
            // 需要 响应实体Result对象
            Result result = Result.error("NOT_LOGIN");
            //转换成json
            String jsonString = JSON.toJSONString(result);
            //怎么给前端
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(jsonString);
            //结束
            return false;//没有放行
        }
        //4: 令牌有且合法  return true
        return true;
    }
    /*
        目标资源执行之后执行
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        System.out.println("postHandle...执行资源之后执行");
    }
     /*
        视图渲染完毕后执行 (针对的是jsp页面)
           响应到浏览器之前执行。
      */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        System.out.println("afterCompletion...响应要到浏览器上了...");
    }
}
